package Gestor;

import Clases.Vacacion;
import Clases.VacacionId;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.LogicalExpression;
import org.hibernate.criterion.Restrictions;

public class GestorVacacion extends GestorBase {

    private static GestorVacacion instancia = null;

    public static GestorVacacion obtenerInstancia() {
        if (instancia == null) {
            instancia = new GestorVacacion();
        }
        return instancia;
    }

    @Override
    public Object insertar(Object vacacion) {
        VacacionId numVacacion = null;
        boolean error = false;
        try {

            iniciaOperacion();
            Criteria cr = sesion.createCriteria(Vacacion.class);
            Criterion fecha = Restrictions.eq("id.fecha", ((Vacacion) vacacion).getId().getFecha());
            Criterion numEmpleado = Restrictions.eq("id.numEmpleado", ((Vacacion) vacacion).getId().getNumEmpleado());
            LogicalExpression andExp = Restrictions.and(fecha, numEmpleado);
            cr.add(andExp);
            ArrayList<Vacacion> vacaciones = ((ArrayList<Vacacion>) cr.list());
            if (!vacaciones.isEmpty()) {
                return false;
            } else {
                numVacacion = (VacacionId) sesion.save(vacacion);
                tx.commit();
                error = true;
            }

        } catch (HibernateException he) {
            System.err.println(he.getCause());
            System.err.println(he.getMessage());
            error = false;
            manejaExcepcion(he);
        } finally {
            sesion.close();
        }

        return error;
    }

    public List<Vacacion> getVacacionesPorNumEmpleado(Long numEmpleado) {
        List<Vacacion> listaVacaciones = null;
        String consulta = "select * from vacacion where numEmpleado=:?";
        try {
            iniciaOperacion();
            listaVacaciones = (ArrayList<Vacacion>) sesion.createSQLQuery(consulta)
                    .addEntity(Vacacion.class)
                    .setParameter("?", numEmpleado)
                    .list();

        } finally {
            sesion.close();
        }

        return listaVacaciones;

    }

    public boolean eliminar(Object vacacion) {
        boolean exito = false;
        try {
            iniciaOperacion();
            int filas = sesion.createSQLQuery("DELETE FROM vacacion WHERE numEmpleado= :num AND fecha= :fech")
                    .setParameter("num", ((Vacacion) vacacion).getId().getNumEmpleado())
                    .setParameter("fech", ((Vacacion) vacacion).getId().getFecha())
                    .executeUpdate();
            if (filas >= 1) {
                exito = true;
                tx.commit();
            }
        } catch (HibernateException he) {
            manejaExcepcion(he);

        } finally {
            sesion.close();
        }
        return exito;
    }

}
